package service.impl;

import dao.ProductMapper;
import dao.SoMainMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import pojo.*;
import service.SoMainService;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName 刘星宇
 * @Description TODO
 * @date 2022/12/2 14:20
 * @Version 1.0
 */
@Service
public class SoMainServiceImpl implements SoMainService {
    @Resource
    private SoMainMapper soMainMapper;
    @Resource
    private ProductMapper productMapper;

    @Override
    public int getCount(Somain somain) {
        return soMainMapper.getCount(somain);
    }

    @Override
    public List<Somain> getAllByPage(Page<Somain> p, Somain somain) {
        return soMainMapper.getAllByPage(p, somain);
    }

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void add(Somain somain) {
        if (soMainMapper.checkSoMainBySoID(String.valueOf(somain.getSoId())) != null) {
            //删除
            del(somain);
            //新增
            add1(somain);
        } else {
            add1(somain);
        }
    }

    public void add1(Somain somain) {
        somain.setSoTotal(somain.getTipFee() + somain.getProductTotal());
        soMainMapper.AddSoMain(somain);
        List<Soitem> soList = somain.getSoitems();
        for (Soitem soitem : soList) {
            Soitem s = productMapper.getSoNum(soitem);
            soitem.setSoId(somain.getSoId());
            soitem.setNum(soitem.getNewNum());
            soitem.setItemPrice(soitem.getNum() * soitem.getUnitPrice());
            soitem.setPoNum(soitem.getPoNum());
            soMainMapper.AddSoItem(soitem);
            productMapper.updatePoNumAdd(soitem.getProductCode(), soitem.getNewNum());
        }
    }

    @Override
    public void del(Somain somain) {
        Soitem soitem = new Soitem();
        soitem.setSoId(somain.getSoId());
        List<Soitem> soList = soMainMapper.cxSoMainBySoID(somain);
        for (Soitem soitem1 : soList) {
            soitem.setProductCode(soitem1.getProductCode());
            Soitem s = productMapper.getSoNum(soitem);
            soitem.setPoNum(s.getPoNum());
            soitem.setNewNum(soitem1.getNewNum());
            soMainMapper.DelSoItem(soitem);
            productMapper.updatePoNumDel(soitem.getProductCode(), soitem.getNewNum());
        }
        soMainMapper.DelSoMain(somain);
    }

    @Override
    public void update(Somain somain) {
        soMainMapper.update(somain);
    }

    @Override
    public List<Somain> getAll() {
        return null;
    }

    @Override
    public List<Somain> getAll1() {
        return null;
    }

    @Override
    public Somain getSoMainBySoID(String soId) {
        return soMainMapper.getSoMainBySoID(soId);
    }

    @Override
    public List<Soitem> getSoItemsBySoID(String soId) {
        return soMainMapper.getSoItemsBySoID(soId);
    }

    @Override
    public Somain check1(String soId) {
        Somain somain = soMainMapper.getSoMainBySoID(soId);
        return somain;
    }

    @Override
    public Somain updateSoMainBySoID(BigDecimal soId) {
        return soMainMapper.updateSoMainBySoID(soId);
    }

    @Override
    public Page<Somain> getSoMainPage(Page<Somain> page, Somain somain, int payType) {
        Page<Somain> SoMainPage = new Page<>();
        //设置当前页
        SoMainPage.setCurrentPage(page.getCurrentPage());
        //设置每页条数
        SoMainPage.setPageSize(page.getPageSize());
        //设置每页数据
        SoMainPage.setLists(soMainMapper.getSoMainPage(page, somain, payType));
        //设置总条数
        SoMainPage.setTotalRecord(soMainMapper.getCountSoMain(somain, payType));
        return SoMainPage;
    }

    @Override
    public void endUpd1(Somain somain) {
        soMainMapper.endUpdate1(somain);
    }

    @Override
    public int getSoMainCount(Page<Somain> page, Somain somain) {
        return soMainMapper.SoMainCount(page, somain);
    }

    @Override
    public List<Somain> somainAllByPage(Page<Somain> page, Somain somain) {
        return soMainMapper.SoMainAllByPage(page, somain);
    }

    //出库
    @Override
    public Page<Somain> onboundPage(Page<Somain> page, Somain somain, int payType) {
        Page<Somain> onboundPage = new Page<>();
        //设置当前页
        onboundPage.setCurrentPage(page.getCurrentPage());
        //设置每页条数
        onboundPage.setPageSize(page.getPageSize());
        //设置每页数据
        onboundPage.setLists(soMainMapper.onboundAllByPage(page, somain, payType));
        //设置总条数
        onboundPage.setTotalRecord(soMainMapper.onboundCountSoMain(somain, payType));
        return onboundPage;
    }

    @Override
    public int updOutbound(Somain somain) {
        int i = soMainMapper.updateOnbound(somain);
        List<Soitem> list = soMainMapper.getNum1(somain.getSoId());
        for (Soitem s : list) {
            Product product = new Product();
            Stockrecord sto = new Stockrecord();
            sto.setProductCode(s.getProductCode());
            sto.setOrderCode(String.valueOf(s.getSoId()));
            sto.setCreateUser(somain.getStockUser());
            sto.setStockNum(s.getNum());
            soMainMapper.addStock1(sto);
            product.setProductCode(sto.getProductCode());
            soMainMapper.updNum1(productMapper.getProduct(product), s.getNum());
        }
        return i;
    }

    //付款
    @Override
    public Page<Somain> inMoneyPage(Page<Somain> page, Somain somain, int payType) {
        Page<Somain> inMoneyPage = new Page<>();
        //设置当前页
        inMoneyPage.setCurrentPage(page.getCurrentPage());
        //设置每页条数
        inMoneyPage.setPageSize(page.getPageSize());
        //设置每页数据
        inMoneyPage.setLists(soMainMapper.inMoneyAllByPage(page, somain, payType));
        //设置总条数
        inMoneyPage.setTotalRecord(soMainMapper.inMoneyCountSoMain(somain, payType));
        return inMoneyPage;
    }

    @Override
    public int updateInMoney(Somain somain) {
        int i = 0;
        Payrecord payrecord =new Payrecord();
        Somain somain1 = soMainMapper.checkSoMainBySoID(String.valueOf(somain.getSoId()));
        int paytype =somain1.getPayType();
        int status = somain1.getStatus();
        payrecord.setOrdercode(String.valueOf(somain.getSoId()));
        payrecord.setPayPrice(somain.getPrePayFee());
        payrecord.setAccount(somain.getPrePayUser());
        payrecord.setPayType(3);
        if (paytype == 1 || paytype == 2) {
            soMainMapper.updateinMoney1(somain);
            payrecord.setPayType(2);
            soMainMapper.addinMoney(payrecord);
        } else if (paytype == 3) {
            if (status==2) {
                soMainMapper.updateinMoney1(somain);
                payrecord.setPayType(2);
                float price=somain.getPrePayFee();
                payrecord.setPayPrice(price);
                soMainMapper.addinMoney(payrecord);
            }else if(status == 1){
                soMainMapper.updateinMoney(somain);
                payrecord.setPayType(4);
                float price=somain.getSoTotal()-somain.getPrePayFee();
                payrecord.setPayPrice(price);
                soMainMapper.addinMoney(payrecord);
            }
        }
//        if (paytype == 3){
//            soMainMapper.updateinMoney(somain);
//            soMainMapper.addinMoney(payrecord);
//        }else {
//            soMainMapper.updateinMoney1(somain);
//            soMainMapper.addinMoney(payrecord);
//        }
        return i;
    }

    @Override
    public List<Somain> soReportPage(Page<Somain> page, Somain somain) {
        return soMainMapper.soReportPage(page,somain);
    }

    @Override
    public int soReportCount(Page<Somain> page, Somain somain) {
        return soMainMapper.soReportCount(page, somain);
    }

    @Override
    public List<Somain> getSoAll() {
        Somain somain = new Somain();
        somain.setSoMainCount(soMainMapper.getSoCount());
        somain.setEndCount(soMainMapper.getSoEndCountInt());
        somain.setPayPrice(soMainMapper.getPayPriceFloat1());
        somain.setSoTotalPrice(soMainMapper.getSoTotalPrice());
        List<Somain> somianList =new ArrayList<>();
        somianList.add(somain);
        System.out.println(somain);
        return somianList;
    }

    @Override
    public List<Somain> soReportPage1(Somain somain) {
        return soMainMapper.soReportPage1(somain);
    }

    @Override
    public int soReportCount1(Somain somain) {
        return soMainMapper.soReportCount1(somain);
    }

}
